package com.mark.spring.annotation.register.lazy;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Lazy;
import org.springframework.util.Assert;

/**
 * @Description: 懒加载引导类
 * @Author: Mark
 * @CreateDate: 2019/9/1 21:40
 * @Version: 3.00.001
 * @Copyright : 豆浆油条个人非正式工作室
 *
 * @see  Lazy since 3.0
 *
 * 总结：
 * 懒加载是针对单实例Bean的
 * 第一次获取bean，懒加载bean 进行初始化
 * 第二次获取bean，因为是单实例的bean第二次的时候不会再次进行实例化
 */
@ComponentScan(basePackages = {"com.mark.spring.annotation.register.lazy"})
public class LazyBootstrap {

    public static void main(String[] args) {
        //加载配置，获取bean
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(LazyBootstrap.class);
        //第一次获取bean，懒加载bean 进行初始化
        String song = applicationContext.getBean(String.class);
        //第二次获取bean，因为是单实例的bean第二次的时候不会再次进行实例化
        song = applicationContext.getBean(String.class);

        Assert.notNull(song,"song bean为空");
        System.out.println("获取到的bean信息" + song);

        //关闭上下文
        applicationContext.close();

        /* 控制台打印的结果：
         * ------  懒加载中初始化bean了难得难得 -------
         * 获取到的bean信息《芒种》呵呵~
         *
         * 分析：
         * 单实例的Bean懒加载的Bean在第一次获取的时候才会进行实例化
         * 因为是单实例，所以在第二次获取的时候不会再重新构建实例
         */
    }
}
